#include<etcd/Client.hpp>
#include<etcd/KeepAlive.hpp>
#include<etcd/Response.hpp>
#include<etcd/Value.hpp>
#include<etcd/Watcher.hpp>
#include<thread>

void callback(const etcd::Response &resp)
{
    if(resp.is_ok() == false)
    {
        std::cout << "收到一个错误的事件通知" << resp.error_message() << std::endl;
    }
    for (auto const& ev : resp.events())
    {
        if(ev.event_type() == etcd::Event::EventType::PUT)
        {
            std::cout << "服务信息发生改变: \n";
            std::cout << "原来的值:" << ev.prev_kv().key() << "-" << ev.prev_kv().as_string() << std::endl;
            std::cout << "原来的值:" << ev.kv().key() << "-" << ev.kv().as_string() << std::endl;
        }
        else if(ev.event_type() == etcd::Event::EventType::DELETE_)
        {
            std::cout << "服务信息下线被删除: \n";
            std::cout << "被删除的值:" << ev.prev_kv().key() << "-" << ev.prev_kv().as_string() << std::endl;
        }
    }
}

int main()
{
    std::string etcd_host = "http://127.0.0.1:2379";
    //实例化客户端对象
    etcd::Client client(etcd_host);
    //获取指定的键值对信息  //一个目录下的所有子目录子文件都能获取到
    auto resp = client.ls("/service").get();
    if(resp.is_ok() == false)
    {
        std::cout << "获取键值对失败" << resp.error_message() << std::endl;
        return -1;
    }
    int sz = resp.keys().size();
    for(int i = 1; i < sz; i ++)
    {
        //键值对是value  key是key value是as_string
        std::cout << resp.value(i).as_string() << "可以提供" << resp.key(i) << "服务";
    }
    //实例化一个键值对监控对象
    auto watcher = etcd::Watcher(client, "/service", callback, true);   //true 递归监控所有子目录有没有改变
    watcher.Wait();

    return 0;
}